{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Import Libraries"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from src.diffusion.ddpm import DDPM\n",
    "from src.diffusion.unet import UNet\n",
    "from src.data.mnist import get_mnist_loader_and_transform\n",
    "from src.data.cifar10 import get_cifar10_loader_and_transform\n",
    "from torchvision.utils import save_image, make_grid\n",
    "from src.diffusion.train import train\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "import torch.backends\n",
    "import torch.backends.mps\n",
    "import os"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Configuration of model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "T = 1000\n",
    "dataset = \"mnist\" # can be \"cifar10\" or \"mnist\"\n",
    "\n",
    "PATH_TO_READY_MODEL = None # input path for ready model\n",
    "\n",
    "PATH_TO_SAVE_MODEL = \"model.pth\"\n",
    "EPOCHS = 100 # for cifar10 it should be more than 1000, but for mnist 20-100 should be okay"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "USE MPS\n"
     ]
    }
   ],
   "source": [
    "device = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n",
    "# For Mac OS\n",
    "if torch.backends.mps.is_available():\n",
    "    device = \"mps\"\n",
    "    print(\"USE MPS\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Load dataset"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "if dataset == \"mnist\":\n",
    "    data = get_mnist_loader_and_transform()\n",
    "elif dataset == \"cifar10\":\n",
    "    data = get_cifar10_loader_and_transform()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Setup Model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "ddpm = DDPM(\n",
    "    T = T,\n",
    "    eps_model=UNet(\n",
    "        in_channels=data.in_channels,\n",
    "        out_channels=data.out_channels,\n",
    "        T=T+1,\n",
    "        steps=data.recommended_steps,\n",
    "        attn_step_indexes=data.recommended_attn_step_indexes\n",
    "    ),\n",
    "    device=device\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Train or load ready model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "if PATH_TO_READY_MODEL is not None:\n",
    "    ddpm.load_state_dict(torch.load(PATH_TO_READY_MODEL, map_location=device))\n",
    "else:\n",
    "    _, val_losses = train(\n",
    "        model=ddpm,\n",
    "        optimizer=torch.optim.Adam(params=ddpm.parameters(), lr=2e-4),\n",
    "        epochs=EPOCHS,\n",
    "        device=device,\n",
    "        train_dataloader=data.train_loader,\n",
    "        val_dataloader=data.val_loader\n",
    "    )\n",
    "\n",
    "    path = PATH_TO_SAVE_MODEL if PATH_TO_SAVE_MODEL is not None else \"model.pth\"\n",
    "\n",
    "    torch.save(ddpm.state_dict(), path)\n",
    "\n",
    "    plt.plot(val_losses, label=\"Validation Loss\")\n",
    "\n",
    "    plt.legend()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Show samples"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 1500x600 with 10 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "n_samples = 10\n",
    "x_t = ddpm.sample(n_samples=n_samples, size=data.train_dataset[0][0].shape)\n",
    "\n",
    "result = []\n",
    "for i in range(x_t.shape[0]):\n",
    "    result.append(data.transform_to_pil(x_t[i]))\n",
    "\n",
    "grid = make_grid(x_t, nrow=10)\n",
    "save_image(grid, f\"sample.png\")\n",
    "\n",
    "cols = 5\n",
    "rows = (n_samples // cols) + (0 if n_samples % cols == 0 else 1)\n",
    "fig, axs = plt.subplots(rows, cols, figsize=(3 * cols, 3 * rows))\n",
    "for i in range(len(result)):\n",
    "    row = i // cols\n",
    "    axs[row, i % cols].imshow(result[i], cmap='gray')"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "pytorch_gpu_m1",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
